[数据库]基础Part2
字符集和比较规则- MySQL
数据库中数据需要解决两个问题,一个是数据存储,需要解决原始数据和二进制数据之间的映射问题;另一个问题是数据的比较,常见的需要解决的问题包括大小写是否敏感,不同字符之间的比较(eg: 中文字符、法文字符等)
字符集查询
语句 SHOW (CHARACTER SET | CHARSET) [LIKE 匹配模式];
可以用于查询 MySQL 支持的数据集,字符集对应的默认比较规则,以及一个字符需要的最大字节
比较规则查询
查询语句 SHOW COLLATION [LIKE 匹配模式];
可以查看比较规则。一个字符集对应了多个比较规则,其主要的结构是 <数据集>_<语言类型>_<后缀>
,主要需要注意后缀信息如下:
后缀 | 英文意义 | 解释描述 |
---|---|---|
_ai |
accent insensitive | 不区分重音 |
_as |
accent sensitive | 区分重音 |
_ci |
case insensitive | 不区分大小写 |
_cs |
case sensitive | 区分大小写 |
_bin |
binary | 以二进制形式比较 |
字符集和比较规则应用
字符集和比较规则在使用上,包括四种类型的级别:
- 服务器级别,查询语句
SHOW VARIABLES LIKE 'character_set_server';
是用于查询服务器级别字符集;查询语句SHOW VARIABLES LIKE 'collation_server';
用于查询服务器级别的比较规则。服务器级别的配置项,可以在配置文件中的[server]
组中完成——需要配置character_set_server
和collation_server
两个变量信息。此外可以通过SET character_set_server=<字符集>;
的方式修改 - 数据库级别,查询语句
SHOW VARIABLES LIKE 'charater_set_database';
用于查询数据库级别字符集;查询语句SHOW VARIABLES LIKE 'collation_database';
用于查询数据库级别的比较规则。数据库级别的字符集和比较规则,是在创建时声明CREATE DATABASE <数据库名称> CHARACTER SET <字符集名称> COLLATE <比较规则名称>;
或者使用ALTER DATABASE <数据库名称> CHARACTER SET <字符集名称> COLLATE <比较规则名称>;
方式修改 - 表级别,如果需要强制修改表的字符集和比较规则,需要创建表时声明
CREATE TABLE <表名称> (列信息) CHARACTER SET <字符集名称> COLLATE <比较规则名称>;
或者使用ALTER TABLE <表名称> CHARACTER SET <字符集名称> COLLATE <比较规则名称>;
方式修改。如果在创建时没有强制声明,那么会使用数据库的字符集和比较规则 - 列级别,存储的列可以使用不同的字符集和比较规则,同样需要在创建时声明或者修改:
CREATE TABLE <表名称> (<字段名称> 字符串类型 CHARACTER SET <字符集名称> COLLATE <比较规则>);
和ALTER TABLE <表名称> MODIFY <字段名称> 字符串类型 CHARACTER SET <字符集名称> COLLATE <比较规则>;
。如果字段没有声明字符集名称和比较规则,那么会使用表级别信息。
从发送请求到接收响应的过程中发生的字符集转换如下所示:
- 客户端发迭的请求字节序列是采用哪种字符线进行编码的。这一步骤主要取决于操作系统当前使用的字符集:对于 Windows操作系统来说,还与客户端启动时设置的
default-character-set
启动选项有关 - 服务器接收到请求字节序列后会认为它是采用哪种字符 进行编码的。这一步骤取决于系统变量
character_set_client
的值,服务器在运行过程中会把请求的字节序列转换为以哪种字符集编码的字节序列。这一步骤取决于系统变盘character_set_ connection
的值 - 服务器在向客户端返回字节序列时,是采用哪种字符集进行编码的。这一步骤取决于系统变量
cbaracter_set_result
的值。 - 客户端在收到响应字节序列后,是怎么把它们写到黑框框中的。这一步骤主要取决于操作系统当前使用的字符集。对于 Windows 操作系统来说,还与客户端启动时设置 的
default-cbaracter-set
启动选项有关